/*
 * @Description: 类的继承
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-04-29 10:51:55
 * @LastEditTime: 2021-04-30 11:49:46
 */
class Persion {
	// 申明属性
	name: string
	age: number
	gender: string = "男"

	// 定义构造函数
	constructor(name: string, age: number, gender?: string) {
		this.name = name
		this.age = age
		this.gender = gender ? gender : this.gender
	}

	// 定义实例方法
	sayHi(str: string) {
		return `我叫${this.name},我今年${this.age}岁了，我是个${this.gender}孩子。${str}`
	}
}

/* 定义一个类型 限制类的参数 */
type Params = [string, number, string?]

/* 定义一个类，继承Persion */
class Student extends Persion {
	constructor(...args: Params) {
		// 调用父类的构造函数以便继承父类的构造属性
		// 若在子类构造方法中没有新的任务，可以省略子类的constructor
		super(...args)
	}

	// 子类重写父类方法，使用super调用父类方法
	sayHi(str: string) {
		console.log("这是子类重写的方法")
		return super.sayHi(str)
	}
}

let student = new Student("张三", 18)
console.log(student.sayHi("你叫啥？"))

/* 省略constructor */
class Student2 extends Persion {
	// 子类重写父类方法，使用super调用父类方法
	sayHi(str: string) {
		console.log("这是子类2重写的方法")
		return super.sayHi(str)
	}
}